//
//  NSString+GX_DES.m
//  24-加密
//
//  Created by 曹曹 on 16/8/16.
//  Copyright © 2016年 曹曹. All rights reserved.
//

#import "NSString+GX_DES.h"
#import <CommonCrypto/CommonCrypto.h>

// key,必须8位
#define key @"01234567"
// 向量,必须8位
static Byte iv[] = {1, 2, 3, 4, 5, 6, 7, 8};

@implementation NSString (GX_DES)

// DES加密
- (NSString *)DESString {
    // 1.将OC字符串转换成C字符串
    const char *string = [self UTF8String];
    // 2.接收容器
    unsigned char bytes[1024];
    // 3.容器大小
    size_t dataOutMoved = 0;
    // 4.DES加密过程
    // 参数1:加密/解密
    // 参数2:加密/解密的方式
    // 参数3:分组密码的选项
    // 参数4:密钥
    // 参数5:密钥的大小
    // 参数6:向量
    // 参数7:C字符串
    // 参数8:C字符串长度
    // 参数9:接收容器
    // 参数10:容器的大小
    // 参数11:容器最终的个数
    CCCryptorStatus cryptoStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, string, strlen(string), bytes, 1024, &dataOutMoved);
    // 5.判断是否成功
    if (cryptoStatus == kCCSuccess) {
        // 转成字符串返回-----base64
        NSData *DESData = [NSData dataWithBytes:bytes length:dataOutMoved];
        NSString *desBaseString = [DESData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
        return desBaseString;
    } else {
        // 返回 nil
        NSLog(@"DES加密失败!");
        return nil;
    }
}
// DES解密
- (NSString *)stringForDES {
    // 1.将base64字符串转成NSData
    NSData *base64Data = [[NSData alloc] initWithBase64EncodedString:self options:NSDataBase64DecodingIgnoreUnknownCharacters];
    // 2.将NSData转成C字符串
    const void *bytes = base64Data.bytes;
    // 3.容器
    unsigned char buffer[1024];
    // 4.容器大小
    size_t dataOutMoved = 0;
    // 5.解密过程
    CCCryptorStatus cryptoStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, bytes, strlen(bytes), buffer, 1024, &dataOutMoved);
    if (cryptoStatus == kCCSuccess) {
        // 将容器中的内容转成字符串返回-----NSString
        NSData *sourceData = [NSData dataWithBytes:buffer length:dataOutMoved];
        NSString *sourceString = [[NSString alloc] initWithData:sourceData encoding:NSUTF8StringEncoding];
        return sourceString;
    } else {
        NSLog(@"解密失败!");
        return nil;
    }
}

@end
